package com.parent.utils;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author yan
 * @Date 2023/7/26 0026 14:58
 * @Description
 */
public class JsonUtils {

    /**
     * list转JSON
     * @param list
     * @return
     * @param <T>
     */
    public static<T> JSONArray listToJsonArray(List<T> list) {
        if(list==null||list.isEmpty()){
            return new JSONArray();
        }
        T t = list.get(0);
        String className = t.getClass().getSimpleName();
        List<JSONObject> jsonObjectList = list.stream().map(one -> {
            String input = one.toString();
            return toJsonObject(input, className);

        }).collect(Collectors.toList());
        JSONArray jsonArray = new JSONArray(jsonObjectList.size());

        jsonObjectList.stream().forEach(jsonObject->jsonArray.put(jsonObject));

        return jsonArray;
    }


    /**
     * 实体转JSON
     * @param t
     * @return
     * @param <T>
     */
    public static<T> JSONObject objectToJsonObject(T t) {
        String input = t.toString();
        String className = t.getClass().getSimpleName();
        return toJsonObject(input, className);
    }

    /**
     * 实体转JSON格式底层逻辑
     * @param input
     * @param className
     * @return
     */

    public static JSONObject toJsonObject(String input, String className) {
        String[] fields = input.replace("[", "")
                .replace(className, "")
                .replace("(", "")
                .replace(")", "")
                .replace("]", "")
                .split(",");
        JSONObject jsonObject = new JSONObject();
        for (String field : fields) {
            String[] keyValue = field.split("=");
            String key = keyValue[0].trim();
            String value = keyValue[1].trim();
            jsonObject.put(key, value);
        }
        return jsonObject;
    }

    /**
     * 删除json 开头‘_’ 下划线
     * @param jsonStr
     * @return
     */
    public static JSONObject removeUnderscoreInJson(String jsonStr) {
        // 解析JSON字符串为JSONObject对象
        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);

        // 递归处理JSONObject对象
        processJsonObject(jsonObject,"_");

        // 返回处理后的JSON字符串
        return jsonObject;
    }

    /**
     * 删除json 开头key
     * @param jsonStr
     * @param key
     * @return
     */
    public static JSONObject removeUnderscoreInJson(String jsonStr,String key) {
        // 解析JSON字符串为JSONObject对象
        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);

        // 递归处理JSONObject对象
        processJsonObject(jsonObject,key);

        // 返回处理后的JSON字符串
        return jsonObject;
    }

    private static void processJsonObject(JSONObject jsonObject,String key) {
        // 创建新的JSONObject对象用于存储处理后的字段
        JSONObject newJsonObject = JSONUtil.createObj();

        // 在遍历之前先获取字段名集合的副本
        String[] fieldNames = jsonObject.keySet().toArray(new String[0]);

        // 遍历JSONObject的每个字段
        for (String fieldName : fieldNames) {
            Object fieldValue = jsonObject.get(fieldName);

            // 检查字段名是否以"_"开头
            if (fieldName.startsWith(key)) {
                // 如果是，则移除开头的"_"字符
                String newFieldName = fieldName.substring(1);
                newJsonObject.put(newFieldName, fieldValue);
            } else {
                // 如果不是以"_"开头，保持原样
                newJsonObject.put(fieldName, fieldValue);
            }

            // 递归处理字段值
            if (fieldValue instanceof JSONObject) {
                processJsonObject((JSONObject) fieldValue,key);
            } else if (fieldValue instanceof JSONArray) {
                processJsonArray((JSONArray) fieldValue,key);
            }
        }

        // 将处理后的字段重新设置到原始JSONObject中
        jsonObject.clear();
        jsonObject.putAll(newJsonObject);
    }

    private static void processJsonArray(JSONArray jsonArray,String key) {
        // 遍历JSONArray中的每个元素
        for (int i = 0; i < jsonArray.size(); i++) {
            Object element = jsonArray.get(i);

            // 递归处理元素
            if (element instanceof JSONObject) {
                processJsonObject((JSONObject) element,key);
            } else if (element instanceof JSONArray) {
                processJsonArray((JSONArray) element,key);
            }
        }
    }
}
